/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package frontera.PDF;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import control.SIRHApp;
import entidad.Cargo;
import entidad.Empleado;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JOptionPane;
/**
 *
 * @author Silex RPR
 */
public class GenerarPDF {



    public void crearPDF(Calendar fecha, String directorio, ArrayList<Empleado> empleados, ArrayList<Cargo> cargos, ArrayList<Integer> diasTrabajados, ArrayList<Double> valorDiasTrabajados,
                                     ArrayList<Integer[]> tiposHorasExtras, ArrayList<Double> valorHorasExtras, ArrayList<Double> valorBonos,
                                     ArrayList<Double> valorTotalEmpleados, Double totalValorEmpleados, ArrayList<Double> subsidioTransporte, ArrayList<Double> valorPrestacionSalud,
                                     ArrayList<Double> valorPrestacionPension, ArrayList<Double> valorPrestacionARP, ArrayList<Double> valorSalarioDevengado,
                                     Double saludEmpleador, Double pensionEmpleador, Double arpEmpleador,
                                     Double senaParafiscales, Double icbfParafiscales, Double cajasDeCompensacionParafiscales,
                                     Double totalNomina)
            throws DocumentException, IOException {

        crearDirectorio(directorio);
        String nombreArchivo = crearNombreArchivo(fecha);

        Document document = new Document(PageSize.A2.rotate());

        try{
            PdfWriter.getInstance(document, new FileOutputStream(nombreArchivo));
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(SIRHApp.getInstance().getVentanaPrincipal(), "El archivo PDF con el reporte de nomina que solicito no se pudo generar. \n"
                    + "    Por favor cierre el archivo de reporte de nomina de la misma fecha.", "Error Generacion PDF", JOptionPane.ERROR_MESSAGE);
            return;
        }

        document.open();

        Image logoEmpresa = Image.getInstance("./src/frontera/recursos/logo.png");
        logoEmpresa.scalePercent(50);
        logoEmpresa.setAlignment(Image.MIDDLE);

        document.add(logoEmpresa);

        document.add(getTablaNomina(empleados, cargos, diasTrabajados, valorDiasTrabajados, tiposHorasExtras, valorHorasExtras, valorBonos,
                                     valorTotalEmpleados, subsidioTransporte, valorPrestacionSalud, valorPrestacionPension, valorPrestacionARP,
                                     valorSalarioDevengado));
        document.newPage();

        document.add(logoEmpresa);
        document.add(getTablaPrestaciones(totalValorEmpleados, saludEmpleador, pensionEmpleador, arpEmpleador, senaParafiscales,
                                        icbfParafiscales, cajasDeCompensacionParafiscales, totalNomina));
        document.close();

       if (Desktop.isDesktopSupported()) {
           if ( JOptionPane.showConfirmDialog(SIRHApp.getInstance().getVentanaPrincipal(), "           El reporte de nomina se genero correctamente.\n"
                   + "¿Desea abrir el reporte de nomina generado en su lector de PDF?" , "Lectura Reporte De Nomina",JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION)
           {
                File archivoPDF = new File(nombreArchivo);
                Desktop.getDesktop().open(archivoPDF);
           }
       }

       else
       {
          JOptionPane.showMessageDialog(SIRHApp.getInstance().getVentanaPrincipal(), "El reporte de nomina se genero correctamente y se encuentra en PDF. \n"
                    + "en la carpeta del programa.", "Error Generacion PDF", JOptionPane.INFORMATION_MESSAGE);
       }

    }

    public PdfPTable getTablaNomina( ArrayList<Empleado> empleados, ArrayList<Cargo> cargos, ArrayList<Integer> diasTrabajados, ArrayList<Double> valorDiasTrabajados,
                                     ArrayList<Integer[]> tiposHorasExtras, ArrayList<Double> valorHorasExtras, ArrayList<Double> valorBonos,
                                     ArrayList<Double> valorTotalEmpleados, ArrayList<Double> subsidioTransporte, ArrayList<Double> valorPrestacionSalud,
                                     ArrayList<Double> valorPrestacionPension, ArrayList<Double> valorPrestacionARP, ArrayList<Double> valorSalarioDevengado)
        throws DocumentException, IOException {

        ArrayList<String> arrayLabels = new ArrayList<String>();
        arrayLabels.add("Nombre De Empleado");
        arrayLabels.add("Sueldo Basico");
        arrayLabels.add("Dias Trabajados");
        arrayLabels.add("Valor Dias Trabajados");
        arrayLabels.add("Horas Extras Diurnas");
        arrayLabels.add("Horas Extras Nocturnas");
        arrayLabels.add("Horas Extras Festivas");
        arrayLabels.add("Horas Extras Festivas Nocturnas");
        arrayLabels.add("Valor Horas Extras");
        arrayLabels.add("Subtotal");
        arrayLabels.add("Bonos");
        arrayLabels.add("Total");
        arrayLabels.add("Subsidio Transporte");
        arrayLabels.add("Salud");
        arrayLabels.add("Pension");
        arrayLabels.add("ARP");
        arrayLabels.add("Salario Devengado Al Empleado");

        PdfPTable table = new PdfPTable(new float[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
        table.setWidthPercentage(100f);
        table.getDefaultCell().setUseAscender(true);
        table.getDefaultCell().setUseDescender(true);

        Date dia = new Date();
        Font f = new Font();
        f.setColor(BaseColor.WHITE);
        f.setSize(21);

        PdfPCell cell = new PdfPCell(new Phrase("Reporte De Nomina", f));
        cell.setBackgroundColor(BaseColor.BLACK);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setColspan(17);
        table.addCell(cell);

        cell = new PdfPCell(new Phrase(dia.toString(), f));
        cell.setBackgroundColor(BaseColor.BLACK);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setColspan(17);
        table.addCell(cell);

        for (int i = 0; i < 2; i++) {
            for( String label: arrayLabels){
                cell = new PdfPCell(new Phrase(label));
                cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
                table.addCell(cell);}
        }

        table.getDefaultCell().setBackgroundColor(null);
        table.setHeaderRows(3);
        table.setFooterRows(1);

        NumberFormat formatter = new DecimalFormat("#0.00");

        for (int i = 0; i < empleados.size(); i++) {
            Empleado e = empleados.get(i);
            Cargo cargoBuscado = buscarCargo(cargos, e.getCargoAsociado().getCambiosCargos().getId());
            
            table.addCell(e.getNombre());
            table.addCell(formatter.format( Double.valueOf(cargoBuscado.getSalarioBásico() ) * ( ( Double.valueOf(e.getPorcentajeSalarioBas()) )/100)));
            table.addCell(String.valueOf(diasTrabajados.get(i)));
            table.addCell(formatter.format(valorDiasTrabajados.get(i)));

            table.addCell(String.valueOf(tiposHorasExtras.get(i)[0]));
            table.addCell(String.valueOf(tiposHorasExtras.get(i)[1]));
            table.addCell(String.valueOf(tiposHorasExtras.get(i)[2]));
            table.addCell(String.valueOf(tiposHorasExtras.get(i)[3]));
            table.addCell(formatter.format(valorHorasExtras.get(i)));

            table.addCell(formatter.format((valorDiasTrabajados.get(i)+valorHorasExtras.get(i))));

            table.addCell(formatter.format(valorBonos.get(i)));
            table.addCell(formatter.format(valorTotalEmpleados.get(i)));

            table.addCell(formatter.format(subsidioTransporte.get(i)));
            table.addCell(formatter.format(valorPrestacionSalud.get(i)));
            table.addCell(formatter.format(valorPrestacionPension.get(i)));
            table.addCell(formatter.format(valorPrestacionARP.get(i)));

            table.addCell(formatter.format(valorSalarioDevengado.get(i)));
        }

        return table;
    }


    public PdfPTable getTablaPrestaciones(Double totalValorEmpleados, Double saludEmpleador, Double pensionEmpleador, Double arpEmpleador,
                                            Double senaParafiscales, Double icbfParafiscales, Double cajasDeCompensacionParafiscales,
                                            Double totalNomina)
                        throws DocumentException, IOException {

            PdfPTable table = new PdfPTable(new float[] {1, 1, 1});

            table.setWidthPercentage(100f);
            table.getDefaultCell().setUseAscender(true);
            table.getDefaultCell().setUseDescender(true);

            Date dia = new Date();
            Font f = new Font();
            f.setColor(BaseColor.WHITE);
            f.setSize(21);

            PdfPCell cell = new PdfPCell(new Phrase("Reporte De Nomina", f));
            cell.setBackgroundColor(BaseColor.BLACK);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setColspan(3);
            table.addCell(cell);

            cell = new PdfPCell(new Phrase(dia.toString(), f));
            cell.setBackgroundColor(BaseColor.BLACK);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setColspan(3);
            table.addCell(cell);

            f = new Font();
            f.setColor(BaseColor.BLACK);
            f.setSize(19);

            NumberFormat formatter = new DecimalFormat("#0.00");
 
            cell = new PdfPCell(new Phrase("Total Antes De Parafiscales y Prestaciones", f));
            cell.setColspan(2);
            cell.setPadding(10);
            table.addCell(cell);
            table.addCell(formatter.format(totalValorEmpleados));

            cell = new PdfPCell(new Phrase("Prestaciones De Ley", f));
            cell.setPadding(10);
            cell.setRowspan(4);
            table.addCell(cell);
            cell = new PdfPCell(new Phrase("Salud Empleador", f));
            table.addCell(cell);
            cell.setColspan(2);
            table.addCell(formatter.format(saludEmpleador));
            cell = new PdfPCell(new Phrase("Pension Empleador", f));
            table.addCell(cell);
            table.addCell(formatter.format(pensionEmpleador));
            cell = new PdfPCell(new Phrase("ARP", f));
            table.addCell(cell);
            table.addCell(formatter.format(arpEmpleador));
            cell = new PdfPCell(new Phrase("Total De Prestaciones De Ley", f));
            table.addCell(cell);
            table.addCell(formatter.format(saludEmpleador + arpEmpleador + pensionEmpleador));

            cell = new PdfPCell(new Phrase("Parafiscales", f));
            cell.setPadding(10);
            cell.setRowspan(4);
            table.addCell(cell);
            cell = new PdfPCell(new Phrase("Sena", f));
            table.addCell(cell);
            cell.setColspan(2);
            table.addCell(formatter.format(senaParafiscales));
            cell = new PdfPCell(new Phrase("ICBF", f));
            table.addCell(cell);
            table.addCell(formatter.format(icbfParafiscales));
            cell = new PdfPCell(new Phrase("Cajas De Compensacion", f));
            table.addCell(cell);
            table.addCell(formatter.format(cajasDeCompensacionParafiscales));
            cell = new PdfPCell(new Phrase("Total De Parafiscales", f));
            table.addCell(cell);
            table.addCell(formatter.format(senaParafiscales + icbfParafiscales + cajasDeCompensacionParafiscales));

            cell = new PdfPCell(new Phrase("Total De La Nomina", f));
            cell.setColspan(2);
            cell.setPadding(10);
            table.addCell(cell);
            table.addCell(formatter.format(totalNomina));

            return table;

    }

    public void crearDirectorio(String directorio)
    {
        File dir = new File(directorio);

        if (!dir.exists())
        {
            dir.mkdir();
        }
    }

    public String crearNombreArchivo(Calendar fecha)
    {
        String nombreArchivo = "Reportes De Nomina/Reporte Nomina - " +
                        fecha.get(Calendar.DATE) + "-" +
                      ( fecha.get(Calendar.MONTH) + 1 ) + "-" +
                        fecha.get(Calendar.YEAR) + ".pdf";

        return nombreArchivo;

    }
    
    public Cargo buscarCargo(ArrayList<Cargo> cargos, long ID){
        for (Cargo c : cargos){
            if ((long)c.getCambiosCargos().getId() == ID){
                return c;
            }
        }
        return null;
    }

}
